package com.hsmw.domain.vo;

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

/**
 * @author WD
 * @version 1.0
 * @description: TODO
 * @date 2021/3/24 10:24
 */
public class DelayedVo<T> implements Delayed {

	/**
	 * 到期时间 单位：ms
	 */
	private long activeTime;
	private T data;

	public DelayedVo(long activeTime, T data) {
		super();
		this.activeTime = TimeUnit.NANOSECONDS.convert(activeTime, TimeUnit.MILLISECONDS) + System.nanoTime();
		this.data = data;
	}

	@Override
	public long getDelay(TimeUnit unit) {
		// 剩余时间= 到期时间-当前系统时间，系统一般是纳秒级的，所以这里做一次转换
		long d = unit.convert(activeTime - System.nanoTime(), TimeUnit.NANOSECONDS);
		return d;
	}

	@Override
	public int compareTo(Delayed o) {
		// 剩余时间-当前传入的时间= 实际剩余时间（单位纳秒）
		long d = getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS);
		// 根据剩余时间判断等于0 返回1 不等于0
		// 有可能大于0 有可能小于0  大于0返回1  小于返回-1
		return (d == 0) ? 0 : ((d > 0) ? 1 : -1);
	}
}
